<?php

/**
 * Запрос приложения в режиме командной строки.
 *
 */
class Kernel_Request_Cli implements Kernel_Request_Interface {

    /**
     * Параметры запроса.
     *
     * @var     array
     */
    private $_params = array();

    /**
     * Конструктор.
     *
     */
    public function __construct() {
        $argc = $_SERVER['argc'];
        $argv = $_SERVER['argv'];

        // если переданы аргументы командной строки (первый элемент массива не
        // считается, это имя файла)
        if ($argc > 1) {
            for ($i = 1; $i < $argc; $i++) {

                // если это наименование параметра
                if ($this->_isParamName($argv[$i])) {

                    // и после него следует еще один аргумент
                    if (($argc > $i + 1)

                        // и это не наименование параметра
                        && !$this->_isParamName($argv[$i + 1])) {

                        // добавляем наименование параметра и его значение
                        // в ассоциативный массив
                        $this->_params[substr($argv[$i], 1)] = $argv[++$i];
                    } else {
                        // иначе добавляем в массив просто наименование параметра
                        $this->_params[$argv[$i]] = true;
                    }
                }
            }
        }
    }

    /**
     * Возвращает значение параметра.
     *
     * @param   string  $param
     * @param   mixed   $default
     * @return  mixed
     */
    public function get($param, $default = null) {
        return get_array_element($this->_params, $param, $default);
    }

    /**
     * Возвращает, передан ли указанный параметр.
     *
     * @param   string  $param
     * @param   boolean $empty
     * @return  boolean
     */
    public function has($param, $empty = false) {
        return $empty ? isset($this->_params[$param]) : !empty($this->_params[$param]);
    }

    /**
     * Возвращает, является ли указанный аргумент наименованием параметра.
     *
     * @param   string   $arg
     * @return  boolean
     */
    private function _isParamName($arg) {
        return '-' == substr($arg, 0, 1);
    }
}
